import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.LayoutManager;
import java.awt.Rectangle;
import java.awt.ScrollPane;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.imageio.ImageIO;
import javax.swing.BorderFactory;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.border.Border;
import javax.swing.table.DefaultTableCellRenderer;

public class SelectCharFrame implements ActionListener {
	/* Cria o Frame Principal */
	public JFrame frame;

	/* Cria��o das Panels */
	JPanel principalPanel = new JPanel();
	JPanel buttonPanel = new JPanel();

	/* Vari�veis de Controle e armazenamento de dados */
	int i = 0;
	String nome;
	List<String> nomes = new ArrayList<>();

	/* Cria��o das Labels */
	JLabel imagemLabel = new JLabel();
	JLabel charLabel = new JLabel("Descri��o Do Personagem:");

	/* Cria��o dos Bot�es que s�o alterados em mais de um m�todo */
	JButton addButton = new JButton("Adicionar");
	JButton playButton = new JButton("Jogar");
	JButton deleteButton = new JButton("Excluir");

	/* Cria��o da Tabela */
	JTable equipeTable = new JTable(3, 1);

	public SelectCharFrame() {
		initialize();
	}

	private void initialize() {
		/* Cria e modifica os aspectos do frame inteiro. */
		setarFrame();

		principalPanel.setLayout(null);

		buttonPanel = newPanel(12, 0, 776, 130, null, principalPanel);
		JPanel descriptionPanel = newPanel(12, 130, 500, 300, new BorderLayout(0, 0), principalPanel);
		JPanel tablePanel = newPanel(518, 130, 270, 300, new BorderLayout(0, 0), principalPanel);
		JPanel bControlPanel = new JPanel();
		
		
		bControlPanel.setLayout(new GridLayout(2,1));
		tablePanel.add(bControlPanel, BorderLayout.SOUTH);
		
		

		/* Label em cima dos bot�es */
		JLabel charSelecLabel = new JLabel(
				"Selecionar Personagens para a Equipe:");
		charSelecLabel.setHorizontalAlignment(SwingConstants.CENTER);
		charSelecLabel.setBounds(240, 25, 311, 14);
		buttonPanel.add(charSelecLabel);

		/* Cria��o de Bot�es */

		criarBotoesChars();

		/* Configura��o da Label que est� escrito "Descri��o do Personagem */

		charLabel.setBounds(0, 1, 183, 15);
		descriptionPanel.add(charLabel);
		charLabel.setVisible(false);

		/* Configura��o da Label que est� as caracter�sticas dos personagens */

		descriptionPanel.add(imagemLabel);
		imagemLabel.setBounds(0, 17, 500, 250);

		/* Bot�o do Adicionar Personagens na Equipe */

		addButton.setEnabled(false);
		descriptionPanel.add(addButton, BorderLayout.SOUTH);
		addButton.addActionListener(this);

		/* Manipula��o da Tabela */
		DefaultTableCellRenderer centerRenderer = new DefaultTableCellRenderer();
		centerRenderer.setHorizontalAlignment(JLabel.CENTER);
		Border blackline = BorderFactory.createLineBorder(Color.black);
		equipeTable.setName("Equipe");
		equipeTable.setRowHeight(40);
		equipeTable.setBounds(0, 17, 270, 120);
		equipeTable.setBorder(blackline);
		equipeTable.setVisible(false);
		equipeTable.getColumnModel().getColumn(0).setCellRenderer(centerRenderer);
		tablePanel.add(equipeTable);

		// bot�o que exclui um jogador da equipe
		bControlPanel.add(deleteButton);
		// deleteButton.setBounds(1, 246, 268, 25);
		deleteButton.setEnabled(false);
		deleteButton.addActionListener(this);

		// bot�o de iniciar a partida
		playButton.setEnabled(false);
		bControlPanel.add(playButton);
		playButton.addActionListener(this);

	}

	private JPanel newPanel(int x, int y, int width, int height, LayoutManager layout, JPanel panel1) {
		JPanel panel = new JPanel();

		panel.setBounds(x, y, width, height);
		panel.setLayout(layout);
		panel1.add(panel);

		return panel;
	}

	private void setarFrame() {
		frame = new JFrame("Sele��o de Personagem");
		frame.setBounds(100, 100, 800, 500);
		frame.setResizable(false);
		frame.setVisible(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.getContentPane().add(principalPanel, BorderLayout.CENTER);
	}

	private void criarBotoesChars() {
		newCharButton("Ladr�o", 240, 84);
		newCharButton("Pirata", 460, 84);
		newCharButton("Mec�nico", 350, 84);
		newCharButton("Rob�", 570, 84);
		newCharButton("ExMilitar", 130, 84);
		newCharButton("Cientista", 240, 50);
		newCharButton("Alquimista", 350, 50);
		newCharButton("M�dico", 460, 50);
	}

	private void newCharButton(String nome, int x, int y) {
		JButton button = new JButton(nome);
		button.setBounds(x, y, 100, 23);
		button.addActionListener(this);
		buttonPanel.add(button);
	}

	/* Pega a img dos resources e adiciona ao .exe */
	public ImageIcon getImage(String url) {
		Image img = null;
		try {
			img = ImageIO.read(getClass().getResource(url));
		} catch (IOException e) {
			e.getMessage();
		}
		ImageIcon im = new ImageIcon(img);
		return im;
	}

	public void ajustaControle() {

		if (this.i >= 3) {
			addButton.setEnabled(false);
			playButton.setEnabled(true);

		} else if (this.i > 0) {
			addButton.setEnabled(true);
			playButton.setEnabled(false);
			deleteButton.setEnabled(true);

		} else {
			addButton.setEnabled(true);
			playButton.setEnabled(false);
			deleteButton.setEnabled(false);
		}
	}

	public void tratamentoBotao(String url, String nome) {
		this.nome = nome;
		charLabel.setVisible(true);
		imagemLabel.setIcon(getImage(url));
		addButton.setEnabled(true);
		ajustaControle();
	}

	@Override
	public void actionPerformed(ActionEvent action) {
		String buttonName = action.getActionCommand();
		String url;
		String name;
		switch (buttonName) {
		case "Ladr�o":
			name = "Ladr�o";
			url = "resources/LadraoDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "Alquimista":
			name = "Alquimista";
			url = "resources/AlquimistaDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "M�dico":
			name = "M�dico";
			url = "resources/MedicoDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "Cientista":
			name = "Cientista";
			url = "resources/CientistaDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "Rob�":
			name = "Rob�";
			url = "resources/RoboDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "Pirata":
			name = "Pirata";
			url = "resources/PirataDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "ExMilitar":
			name = "ExMilitar";
			url = "resources/ExMilitarDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "Mec�nico":
			name = "Mec�nico";
			url = "resources/MecanicoDescricao.png";
			tratamentoBotao(url, name);
			break;

		case "Adicionar":
			nomes.add(this.nome);
			equipeTable.setVisible(true);
			equipeTable.setEnabled(false);
			equipeTable.setValueAt(this.nome, i, 0);
			i++;
			ajustaControle();
			break;

		case "Excluir":
			i--;
			nomes.remove(i);
			equipeTable.setValueAt("", i, 0);
			System.out.println(nomes);
			ajustaControle();
			break;

		case "Jogar":
			principalPanel.removeAll();
			principalPanel.repaint();
			break;
		}
	}
}
